package co.inventario.datos.sqlserver;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import co.inventario.entidad.CiudadDTO;
import co.inventario.entidad.DepartamentoDTO;

public class CiudadDAOSQLServer {

	private String crearSQL;
	private String actualizarSQL;
	private String consultarSQL;

	public CiudadDAOSQLServer() {
		crearSQL = "";
		actualizarSQL = "";
		consultarSQL = "";
	}

	public void crear(CiudadDTO ciudadDTO, Connection connection) throws SQLException {
		crearSQL = "INSERT INTO Ciudad (Nv_Nombre_Ciudad, In_Codigo_Departamento) VALUES (?, ?)";
		try (PreparedStatement preparedStatement = connection.prepareStatement(crearSQL)) {
			preparedStatement.setString(1, ciudadDTO.getNvNombreCiudad());
			preparedStatement.setInt(2, ciudadDTO.getDepartamentoDTO().getInCodigoDepartamento());
			preparedStatement.executeUpdate();
		} catch (SQLException exception) {
			System.err.println("Se ha presentado un problema creando la Ciudad: " + exception.getMessage());
		}
	}

	public void actualizar(CiudadDTO ciudadDTO, Connection connection) throws SQLException {
		actualizarSQL = "UPDATE Ciudad SET Nv_Nombre_Ciudad = ISNULL(?, Nv_Nombre_Ciudad), In_Codigo_Departamento = ISNULL(?, In_Codigo_Departamento) WHERE In_Codigo_Ciudad = ?";
		try (PreparedStatement preparedStatement = connection.prepareStatement(actualizarSQL)) {
			preparedStatement.setString(1, ciudadDTO.getNvNombreCiudad());
			preparedStatement.setInt(2, ciudadDTO.getDepartamentoDTO().getInCodigoDepartamento());
			preparedStatement.setInt(3, ciudadDTO.getInCodigoCiudad());
			preparedStatement.executeUpdate();
		} catch (SQLException exception) {
			System.err.println("Se ha presentado un problema actualizando la Ciudad: " + exception.getMessage());
		}
	}

	public CiudadDTO consultarPorCodigo(CiudadDTO ciudadDTO, Connection connection) throws SQLException {
		consultarSQL = "SELECT * FROM Ciudad WHERE In_Codigo_Ciudad = ?";
		CiudadDTO ciudadDTOResultado = null;
		DepartamentoDTO departamentoDTO = null;
		try (PreparedStatement preparedStatement = connection.prepareStatement(consultarSQL)) {
			preparedStatement.setInt(1, ciudadDTO.getInCodigoCiudad());
			try (ResultSet resultSet = preparedStatement.executeQuery()) {
				if (resultSet.next() == true) {
					ciudadDTOResultado = new CiudadDTO();
					ciudadDTOResultado.setInCodigoCiudad(resultSet.getInt("In_Codigo_Ciudad"));
					ciudadDTOResultado.setNvNombreCiudad(resultSet.getString("Nv_Nombre_Ciudad"));
					departamentoDTO = new DepartamentoDTO();
					departamentoDTO.setInCodigoDepartamento(resultSet.getInt("In_Codigo_Departamento"));
					ciudadDTOResultado.setDepartamentoDTO(departamentoDTO);
				}
			}
		} catch (SQLException exception) {
			System.err.println("Se ha presentado un problema consultando la Ciudad a traves del codigo: " + exception.getMessage());
		}
		return ciudadDTOResultado;
	}

	public CiudadDTO consultarPorNombre(CiudadDTO ciudadDTO, Connection connection) throws SQLException {
		consultarSQL = "SELECT * FROM Ciudad WHERE Nv_Nombre_Ciudad = ?";
		CiudadDTO ciudadDTOResultado = null;
		DepartamentoDTO departamentoDTO = null;
		try (PreparedStatement preparedStatement = connection.prepareStatement(consultarSQL)) {
			preparedStatement.setString(1, ciudadDTO.getNvNombreCiudad());
			try (ResultSet resultSet = preparedStatement.executeQuery()) {
				while (resultSet.next() == true) {
					ciudadDTOResultado = new CiudadDTO();
					ciudadDTOResultado.setInCodigoCiudad(resultSet.getInt("In_Codigo_Ciudad"));
					ciudadDTOResultado.setNvNombreCiudad(resultSet.getString("Nv_Nombre_Ciudad"));
					departamentoDTO = new DepartamentoDTO();
					departamentoDTO.setInCodigoDepartamento(resultSet.getInt("In_Codigo_Departamento"));
					ciudadDTOResultado.setDepartamentoDTO(departamentoDTO);
				}
			}
		} catch (SQLException exception) {
			System.err.println("Se ha presentado un problema consultando la Ciudad a traves del nombre: " + exception.getMessage());
		}
		return ciudadDTOResultado;
	}

	public ArrayList<CiudadDTO> consultarTodo(Connection connection) throws SQLException {
		consultarSQL = "SELECT * FROM Ciudad";
		CiudadDTO ciudadDTOResultado = null;
		DepartamentoDTO departamentoDTO = null;
		ArrayList<CiudadDTO> ciudadDTOLista = new ArrayList<CiudadDTO>();
		try (PreparedStatement preparedStatement = connection.prepareStatement(consultarSQL)) {
			try (ResultSet resultSet = preparedStatement.executeQuery()) {
				while (resultSet.next() == true) {
					ciudadDTOResultado = new CiudadDTO();
					ciudadDTOResultado.setInCodigoCiudad(resultSet.getInt("In_Codigo_Ciudad"));
					ciudadDTOResultado.setNvNombreCiudad(resultSet.getString("Nv_Nombre_Ciudad"));
					departamentoDTO = new DepartamentoDTO();
					departamentoDTO.setInCodigoDepartamento(resultSet.getInt("In_Codigo_Departamento"));
					ciudadDTOResultado.setDepartamentoDTO(departamentoDTO);
					ciudadDTOLista.add(ciudadDTOResultado);
				}
			}
		}
		return ciudadDTOLista;
	}
}
